package com.atguigu.tingshu.order.strategy;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Map;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

public interface OrderTradeStrategy {



    //创建构造OrderInfoVo对象的抽象方法
    public abstract OrderInfoVo trade(TradeVo tradeVo);

    //因为用根据付款项目类型进行判断
    public  abstract  String getItemType();

    public default void setOtherInfo(OrderInfoVo orderInfoVo , TradeVo tradeVo,  RedisTemplate<String  , String> redisTemplate) {

        //创建公共使用的其他数据
        String traNo = UUID.randomUUID().toString().replaceAll("-","");
       //交易编号
        orderInfoVo.setTradeNo(traNo);
        //支付方式
        orderInfoVo.setPayWay(SystemConstant.ORDER_PAY_WAY_WEIXIN);
        //付款的项目类型
        orderInfoVo.setItemType(tradeVo.getItemType());

        //进入到交易页面的时候.就根据策越模式,对付款项目进判断,把交易编号用于判断是否提交过订单,存到redis里面
        String tradeNoRedisKey = RedisConstant.ORDER_TRADE_NO + traNo;


        // long currentTimeMillis = System.currentTimeMillis();
        orderInfoVo.setTimestamp(SignHelper.getTimestamp());   // 当前系统时间
        redisTemplate.opsForValue().set(tradeNoRedisKey,traNo,5, TimeUnit.MINUTES);
        /**
         * 数据签名：就是从OrderInfoVo对象中获取相关字段的数值，然后对数据进行加密，得到签名
         * 作用：后期在进行订单提交的时候，需要使用该数据校验提交的数据的合法性
         */

        Map<String, Object> map = JSON.parseObject(JSON.toJSONString(orderInfoVo), Map.class);
        String sign = SignHelper.getSign(map);
        orderInfoVo.setSign(sign);
    }
}
